idle sizer: Request a motion event after layout
authorMatthias Clasen <mclasen@redhat.com>
Wed, 26 Aug 2020 11:57:07 +0000 (07:57 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 27 Aug 2020 20:01:45 +0000 (16:01 -0400)
When we are reallocating widgets, make sure that
we get a motion event in the next frame cycle,
so the hover state gets updated.

gtk/gtkroot.c

index 24d3860b1d7017e34b2e0fcea189503da213fa1f..33000c28fc460e95e9970423cd317666d5684938 100644 (file)
@@ -199,7 +199,25 @@ gtk_root_layout_cb (GdkFrameClock *clock,
    * since it doesn't cause any actual harm.
    */
   if (gtk_widget_needs_allocate (widget))
-    gtk_native_check_resize (GTK_NATIVE (self));
+    {
+      gtk_native_check_resize (GTK_NATIVE (self));
+      if (GTK_IS_WINDOW (widget))
+        {
+          GdkSeat *seat;
+
+          seat = gdk_display_get_default_seat (gtk_widget_get_display (widget));
+          if (seat)
+            {
+              GdkDevice *device;
+              GtkWidget *focus;
+
+              device = gdk_seat_get_pointer (seat);
+              focus = gtk_window_lookup_pointer_focus_widget (GTK_WINDOW (widget), device, NULL);
+              if (focus)
+                gdk_surface_request_motion (gtk_native_get_surface (gtk_widget_get_native (focus)));
+            }
+        }
+    }
 
   if (!gtk_root_needs_layout (self))
     gtk_root_stop_layout (self);